﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Data;
using System.Web.Script.Serialization;
using System.Data.SqlClient;
using Newtonsoft.Json;
using CMD_WEB.DAL;
using CMD.BAL.SAP;

namespace CMD.BAL.AUTH
{
   [DataContractAttribute]
   public class AuthRol
   {
       public static CMD.BAL.MISC.UpsertStateMsg UpdateRolStatus(string unidSolicitud, string unidRol, string pventa, string datsol_isOtrasCategorias, string datsol_isOtrosClientes, int idStatus, string datsol_unidTipoSolicitante, int idTipoSolicitud, int datsol_isMismoDomicilio)
        {
            //Rol insert;
            CMD.BAL.MISC.UpsertStateMsg rolst;
            try
            {    
                int dt = CMD_WEB.DAL.SrvDB.ExecuteNonQuery("exec SP_CMD_UPSERT_STATUS_ROL'" + unidSolicitud + "','" + unidRol + "','" + pventa + "','" + datsol_isOtrasCategorias + "','" + datsol_isOtrosClientes + "'," + idStatus + ",'" + datsol_unidTipoSolicitante + "'," + idTipoSolicitud + "," + datsol_isMismoDomicilio + "");
                rolst = new MISC.UpsertStateMsg("registros actualizados " + dt.ToString(), true);
                return rolst;
            }
            catch (Exception ex)
            {
                rolst = new MISC.UpsertStateMsg("error al actualizar registros " + ex, false);
                return rolst;
            }

        }
        //public static string UpdateRolStatus(string parametros)
        //{
        //    string mensaje = "";
        //    DataSet result = new DataSet();
        //    SqlCommand sp = new SqlCommand("SP_CMD_UPSERT_STATUS_ROL");
        //    sp.CommandType = CommandType.StoredProcedure;
        //    Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(parametros);
        //    try
        //    {
        //        foreach (KeyValuePair<string, string> d in values)
        //        {
        //            sp.Parameters.AddWithValue(d.Key, d.Value);
        //        }
        //        result = SrvDB.ExecuteCommand(sp);
        //        if (result.Tables.Count == 1)
        //            mensaje = "Se ha guardado su solicitud.";
        //        if (result.Tables.Count == 0)
        //            mensaje = "No se ha podido guardar su solicitud.";
        //    }
        //    catch (Exception ex)
        //    {
        //        throw ex;
        //    }

        //    return mensaje;
        //}
        public AuthRol() 
        {
            
        }
        //public AuthRol(string parametros) 
        //{
        //  this.parametros = parametros;
        //}


        public static CMD.BAL.MISC.UpsertStateMsg UpdateRolStatus2(string unidSolicitud, string unidRol, string pventa, string datsol_isOtrasCategorias, string datsol_isOtrosClientes, int idStatus, string datsol_unidTipoSolicitante, int idTipoSolicitud, int datsol_isMismoDomicilio)
        {
            //Rol insert;
            CMD.BAL.MISC.UpsertStateMsg rolst;

            Dictionary<string, string> input;
            DataTable dtInput, dtOutput, dtChange;
            string mensaje = "", solic ="", kunnr ="" ;
            bool stat = false;

            try
            {
                DataTable dt = CMD_WEB.DAL.SrvDB.ExecuteQuery("exec SP_CMD_UPSERT_STATUS_ROL'" + unidSolicitud + "','" + unidRol + "','" + pventa + "','" + datsol_isOtrasCategorias + "','" + datsol_isOtrosClientes + "'," + idStatus + ",'" + datsol_unidTipoSolicitante + "'," + idTipoSolicitud + "," + datsol_isMismoDomicilio + "");

                if (dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        input = new Dictionary<string, string>();

                        for (int j = 0; j < dt.Columns.Count; j++)
                        {
                            if (dt.Columns[j].ColumnName.ToString() == "KUNNR" && dt.Rows[i]["MTYPE"].ToString()=="EXT")
                                input.Add(dt.Columns[j].ColumnName, kunnr);
                            else
                            input.Add(dt.Columns[j].ColumnName, dt.Rows[i][j].ToString());

                        }

                        SvcSAP sap = new SvcSAP();
                        if (idTipoSolicitud == 2)
                            sap.ChangeSAP(input);
                        else
                            sap.InputSAP(input);

                        dtInput = sap.DtInputSap;
                        dtOutput = sap.DtMsgSap;
                        dtChange = sap.DtChangeSap;

                        if (idTipoSolicitud == 2)
                        {
                            if (dtChange.Rows.Count == 0)
                            {
                                mensaje = "SAP no devolvió registros en la Estructura de Cambio";
                                stat = false;
                            }
                        }
                        else
                        {
                            if (dtInput.Rows.Count == 0)
                            {
                                mensaje = "No se insertaron registros en la estructura de entrada de SAP.";
                                stat = false;
                            }
                        }

                        if (dtOutput.Rows.Count == 0)
                        {
                            mensaje = "No hay registros en la estructura de Salida de SAP.";
                            stat = false;
                        }
                        else
                        {
                            if (dtOutput.Rows[0]["STAT"].ToString() == "OKAD" || dtOutput.Rows[0]["STAT"].ToString() == "OKCH" || dtOutput.Rows[0]["STAT"].ToString() == "OKEX")
                            {
                                mensaje = dtOutput.Rows[0]["MSGV4"].ToString().Replace("&1", dtOutput.Rows[0]["MSGV1"].ToString().Replace("&2", dtOutput.Rows[0]["MSGV2"].ToString()));
                                solic= dtOutput.Rows[0]["SOLIC"].ToString();
                                kunnr= dtOutput.Rows[0]["KUNNR"].ToString();
                                // actualizar en la tabla de smd_solicitud campo "numero de solicitud" con la resultante en la tabla de mensajes de SAP
                                updateNumSolicitud(unidSolicitud, dtOutput.Rows[0]["SOLIC"].ToString(), dtOutput.Rows[0]["KUNNR"].ToString(),"4");

                                stat = true;
                            }
                            else
                            {
                                mensaje = dtOutput.Rows[0]["MSGV4"].ToString().Replace("&1", dtOutput.Rows[0]["MSGV1"].ToString().Replace("&2", dtOutput.Rows[0]["MSGV2"].ToString()));
                                //updateNumSolicitud(unidSolicitud, dtOutput.Rows[0]["SOLIC"].ToString(), dtOutput.Rows[0]["KUNNR"].ToString(),"5");
                                solic= dtOutput.Rows[0]["SOLIC"].ToString();
                                kunnr= dtOutput.Rows[0]["KUNNR"].ToString();
                                i = dt.Rows.Count;

                                stat = false;
                            }
                        }


                    }// for rows

                    // actualizar en la tabla de smd_solicitud campo "numero de solicitud" con la resultante en la tabla de mensajes de SAP
                    if (stat)
                        updateNumSolicitud(unidSolicitud, solic, kunnr, "4");
                    else
                    {
                        updateNumSolicitud(unidSolicitud, "0", "0", "5");
                        SOL.NotificacionesWeb not = new SOL.NotificacionesWeb();
                        not.SendLastMails(unidSolicitud,"","");
                    }

                    rolst = new MISC.UpsertStateMsg(mensaje, stat);

                }
                else rolst = new MISC.UpsertStateMsg("registros actualizados ", true);

                return rolst;
            }
            catch (Exception ex)
            {
                rolst = new MISC.UpsertStateMsg("error al actualizar registros de ROL: " + ex, false);
                return rolst;
            }

        }///////

        private static bool updateNumSolicitud(string unid_sol, string numSol, string numCte,string status)
        {
            bool done = false;
            string query = "SP_CMD_UPDATE_SAP_SOLCTE @UNID_SOL=" + unid_sol.Trim() + ", @NUM_SOL=" + numSol.Trim() + ", @NUM_CTE =" + numCte.Trim() + ", @STATUS =" + status;

            try
            {
                int cnt = CMD_WEB.DAL.SrvDB.ExecuteNonQuery(query);
                done = true;
            }
            catch (Exception ex)
            {
                
                throw ex;
            }

            return done;
        }


   }
}
